from selenium.webdriver import Chrome, ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
import requests

'''根据传递过来的网址，获取response数据返回
url：网站地址'''

def get_response(url):
    # 发送请求
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36"}
    response = requests.get(url=url, headers=headers)
    return response

'''根据传递过来的title, play_url来保存数据
title：文件名
play_url：音乐文件所在的URL'''

def save(title, play_url):
    # 获取音乐文件
    music_content = get_response(play_url).content
    # 保存文件
    with open('D:\\musicDir\\' + title + '.mp3', mode='wb') as f:
        f.write(music_content)
        print(title, '保存成功')

# 创建一个参数对象，用来控制chrome以无界面模式打开
chromeOption = Options()
chromeOption.add_argument('--headless')
chromeOption.add_argument('--disable-gpu')
# 1.通过selenium.webdriver创建Chrome浏览器对象,加入无界面参数
webBrowser = Chrome(options=chromeOption)
#webBrowser.implicitly_wait(5)
#webBrowser = Chrome()
# 2.访问音乐网站
webBrowser.get('http://www.techlabplt.com:8080/BD-PC/music.html?type=1')
# 3.睡几秒，让前端异步数据获取得到。（有可能异步数据的加载稍慢）
time.sleep(5)
# 4.通过xpath方式获取音乐网站的数据
musicList = webBrowser.find_elements(by=By.xpath, value='//*[@id="app"]/div/ul/li')
print(len(musicList))
# 5.循环遍历musicList数据
for music in musicList:
    # 6.切换到Chrome浏览器第一个选项卡页面
    windows = webBrowser.window_handles
    webBrowser.switch_to.window(windows[0])
    time.sleep(2)
    # 7.获取音乐名称
    musicName = str(music.find_element(by=By.xpath, value='./a').text)
    print(musicName)
    # 8.点击此音乐的链接
    musicClick = ActionChains(webBrowser)
    musicClick.move_to_element(music).click(music).perform()
    #music.click()
    # 9.切换到Chrome浏览器最后一个选项卡页面
    windows = webBrowser.window_handles
    webBrowser.switch_to.window(windows[-1])
    # 10.获取页面中的audio的src
    time.sleep(2)
musicUrl = webBrowser.find_element(by=By.xpath,
value='// *[ @ id = "mp3audio"]').get_attribute('src')
print(musicUrl)
# 11.保存音乐文件到本地.
save(musicName, musicUrl)
# 12.关闭音乐播放窗口
webBrowser.close()
